#include <concepts>
#include <string>
#include <iostream>
// 定义一个概念，要求类型 T 必须可复制和可赋值
template<typename T>
concept CopyAssignable = std::copyable<T> && std::assignable_from<T&, T&>;

// 泛型容器类，使用 CopyAssignable 概念约束类型 T
template<CopyAssignable T>
class GenericContainer {
public:
    T value;

    // 泛型构造函数，接受任何满足 CopyAssignable 概念的类型
    GenericContainer(T v) : value(v) {}

    // 一个展示用的成员函数，返回存储的值
    T getValue() const {
        return value;
    }
};

int main() {
    // 使用满足 CopyAssignable 概念的类型
    GenericContainer<int> intContainer(123);
    GenericContainer<std::string> stringContainer("Hello");

    std::cout << "Int Container holds: " << intContainer.getValue() << std::endl;
    std::cout << "String Container holds: " << stringContainer.getValue() << std::endl;

    return 0;
}